//
//  MainViewController.m
//  UI07_1_UIScrollView_UIPageControl
//
//  Created by Scott on 15/4/23.
//  Copyright (c) 2015年 www.lanou3g.com 蓝欧3G. All rights reserved.
//

#import "MainViewController.h"

@interface MainViewController ()

/* 声明为属性 */
@property (nonatomic, retain) UIScrollView *scrollView;
@property (nonatomic, retain) UIPageControl *pageControl;


@end

@implementation MainViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
#pragma mark - 知识点1 UIScrollView
/**
 * @brief 讲解
 *
 * UIScrollView 是可以滚动的view. UIView本身不能滚动.
 * UIScrollView 是所有滚动视图的基类, UITableView, UITextView都是它的子类
 * 使用场景: 显示不下(单张大图), 内容太多(图文混排), 滚动头条(图片), 相册等
 * 
 * UIScrollView 主要专长于两个方面: 
    滚动: contentSize 大于frame.size的时候, 能够滚动.
    缩放: 自带缩放, 可以指定缩放倍数
 */
    
    /* 常用UIScrollView 滚动相关属性 
     * contentSize 
     * contentOffset
     * scrollsToTop
     * pagingEnabled
     * bounces
     */
    
    /* 创建对象 */
    self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(20, 160, self.view.frame.size.width - 40, 300)];
    self.scrollView.backgroundColor = [UIColor grayColor];
    [self.view addSubview:self.scrollView];
    [_scrollView release];
    
    
    /* 设置滚动的范围 */
    self.scrollView.contentSize = CGSizeMake(1000, 0); /* 设置为0 时, 不能移动 */
    
    /* 定义个ImageView加载在scrollview上面 */
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"1.jpg"]];
    imageView.frame = CGRectMake(0, 0, 200, 200); /* 此处的原点坐标为相对坐标, 相对于scrollview中的坐标 */
    [self.scrollView addSubview:imageView];
    [imageView release];

    
    
    /* contentOffset 偏移量 
     * scrollView相对于滚动范围的坐标(scrollView相对于imageView的偏移坐标)
     */
    self.scrollView.contentOffset = CGPointMake(0, 0);
    
    /* 可滚动的范围距离上左下右的距离 */
//    self.scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20);
    
    /* 到达边缘之后是否开启弹动效果 */
    self.scrollView.bounces = YES;
    
    /* 允许用户返回顶部 
     *
     * self.scrollView.contentSize = CGSizeMake(0, 1000); 设置上下滚动之后, 点击屏幕的状态栏,实现效果
     * 默认是开启的
     */
    self.scrollView.scrollsToTop = YES;
    
    /* 是否允许用户滚动 */
    self.scrollView.scrollEnabled = YES;
    
    /* 翻页效果, 按页翻动*/
    self.scrollView.pagingEnabled = YES;
    
    /* 显示横向和纵向的滚动条 
     * 滚动条, 实际上是加在scrollView上的两个imageView
     */
    self.scrollView.showsHorizontalScrollIndicator = YES;
    self.scrollView.showsVerticalScrollIndicator = YES;
    
#pragma mark ** UIScrollView 缩放效果
    /* 1. 签订协议 UIScrollViewDelegate */
    /* 2. 指定代理人 */
    self.scrollView.delegate = self;

    /* UIScrollView 缩放相关属性 */
    self.scrollView.minimumZoomScale = 0.5; /* 缩小的最小比例 */
    self.scrollView.maximumZoomScale = 2; /* 放大的最大比例 */

    
#pragma mark - 知识点2 UIPageControl
/**
 * @ brief 讲解
 *
 * 与UILabel相似, 用于指示当前第几页(代码)
 * 通常于UIScrollView配合使用
 * 
 * @ proper currentPage 当前页
 *
 * @ proper numberOfPage  指定页面的个数
 */

    /* 创建UIPageControl对象 */
    /* 设置为一个属性 */
    self.pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(20, 500, 300, 40)];
    self.pageControl.backgroundColor = [UIColor clearColor];
    [self.view addSubview:self.pageControl];
    [_pageControl release];
    
    /* 指定页面的个数 */
    self.pageControl.numberOfPages = 5;

    /* 当前点的颜色 */
    self.pageControl.currentPageIndicatorTintColor = [UIColor cyanColor];
    
    /* 其它没有选中的颜色 */
    self.pageControl.pageIndicatorTintColor = [UIColor blackColor];
    
    /* 设置初始在第几个界面 */
    self.pageControl.currentPage = 0;
    
    /* 设置换页效果 */
    [self.pageControl addTarget:self action:@selector(pageChange:) forControlEvents:UIControlEventValueChanged];
}

#pragma mark - UIScrollView 缩放代理方法
/**
 * @ brief UIScrollView 缩放代理方法
 *
 * @ method   viewForZoomingInScrollView:
 *              指定某个UIScrollView子视图可以被放大缩小
 *
 * @ method   scrollViewDidEndZooming:withView:atScale:
 *              完成放大缩小触发
 *
 */
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    /* 指定某个UIScrollView子视图可以被放大缩小 */
    
    /**
     * @ brief 讲解
     *
     * 返回一个View跟着ScrollView缩放.
     * 1. 会把contenSize 设置为View 的大小
     * 2. 同时只能有一个View跟着ScrollView缩放
     */
    return [scrollView.subviews firstObject];
}


- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale
{
    /* 完成放大缩小触发 */
}


- (void)pageChange:(UIPageControl *)pageControl
{
    /* 点击pageCoutrol之后, ScrollView 跟着滑动 */
    /* 1. 计算当前page的 x轴值 */
    CGFloat xOff = pageControl.currentPage * 280; /* 假设每个页面280 宽 */
    
    /* 2. 生成偏移量(CGPoint值) */
    CGPoint offset = CGPointMake(xOff, 0);
    
    /* 3. 更改ScrollView的偏移量 */
    [self.scrollView setContentOffset:offset animated:YES];
}

#pragma mark - UIScrollViewDelegate 滚动代理方法
/**
 * @ brief UIScrollView 滚动代理方法
 *
 * @ method  scrollViewDidScroll:
 *              滚动就会触发
 *
 * @ method  scrollViewWillBeginDragging:
 *              开始拖拽时触发
 *
 * @ method  scrollViewDidEndDragging:willDecelerate:
 *              结束拖拽时触发
 *
 * @ method  scrollViewWillBeginDecelerating:
 *              开始减速时触发
 *
 * @ method  scrollViewDidEndDecelerating:
 *              结束减速时触发(停止时)
 *
 */


/**
 * @ brief 总结
 * contentSize决定了scrollView能否滚动，contentOffset控制内容区域的偏移量，pageEnabled控制能否整页滚动。
 *
 * scrollView实现缩放需要指定最大缩放系数，最小缩放系数，并指定缩放的视图。
 */

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSLog(@"%s", __FUNCTION__);
    /* 打印偏移量 */
    NSLog(@"%@", NSStringFromCGPoint(scrollView.contentOffset));
    
}


- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    NSLog(@"%s", __FUNCTION__);
    
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    NSLog(@"%s", __FUNCTION__);
}

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
{
    NSLog(@"%s", __FUNCTION__);
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    NSLog(@"%s", __FUNCTION__);
}



#pragma mark -
- (void)dealloc
{
    [_pageControl release];
    [_scrollView release];
    [super dealloc];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end
